import dayjs from 'dayjs';
import { type TimeType } from '../types';

/**
 * 日期时间核心类
 * @class DateTimeCore
 * @description 提供基础的日期时间操作功能，是DateTime类的基类
 */
export class DateTimeCore {
  /**
   * 内部dayjs实例，用于处理日期时间操作
   * @private
   */
  protected __dayjs: dayjs.Dayjs;

  /**
   * 构造函数（不传参数，使用当前时间）
   * @example
   * const now = new DateTimeCore(); // 创建表示当前时间的实例
   */
  constructor();

  /**
   * 构造函数（传入时间戳，毫秒级或秒级）
   * @param timestamp - 毫秒级时间戳（13位）或秒级时间戳（10位）
   * @returns {DateTimeCore} 新的DateTimeCore实例
   * @example
   * // 毫秒级时间戳
   * const date1 = new DateTimeCore(1670553600000); // 2022-12-09T00:00:00.000Z
   * // 秒级时间戳
   * const date2 = new DateTimeCore(1670553600); // 同样创建2022-12-09T00:00:00.000Z
   */
  constructor(timestamp: number);

  /**
   * 构造函数（传入日期字符串）
   * @param dateString - 日期时间字符串，支持多种格式，如YYYY-MM-DD、YYYY-MM-DD HH:mm:ss等
   * @returns {DateTimeCore} 新的DateTimeCore实例
   * @example
   * const date1 = new DateTimeCore('2025-12-11'); // 仅日期
   * const date2 = new DateTimeCore('2025-12-11 11:10:11'); // 日期和时间
   * const date3 = new DateTimeCore('2025-12-11T11:10:11Z'); // ISO格式
   */
  constructor(dateString: string);

  /**
   * 构造函数（传入原生Date对象）
   * @param date - 原生Date对象
   * @returns {DateTimeCore} 新的DateTimeCore实例
   * @example
   * const date = new DateTimeCore(new Date('2025-12-11'));
   */
  constructor(date: Date);

  /**
   * 构造函数（传入dayjs对象）
   * @param date - dayjs对象
   * @returns {DateTimeCore} 新的DateTimeCore实例
   * @example
   * import dayjs from 'dayjs';
   * const date = new DateTimeCore(dayjs('2025-12-11'));
   */
  constructor(date: dayjs.Dayjs);

  /**
   * 构造函数实现
   * @param {number|string|Date|dayjs.Dayjs|undefined} value - 可选的日期时间值
   * @returns {DateTimeCore} 新的DateTimeCore实例
   */
  constructor(value?: TimeType) {
    // 根据参数类型创建dayjs实例
    if (value === undefined) {
      // 不传参数，使用当前时间
      this.__dayjs = dayjs();
    } else if (typeof value === 'number') {
      // 数字参数，可能是时间戳（毫秒或秒）
      // 检查是否为秒级时间戳（小于1e12）
      if (value < 1e12) {
        // 秒级时间戳，需要转换为毫秒
        this.__dayjs = dayjs(value * 1000);
      } else {
        // 毫秒级时间戳
        this.__dayjs = dayjs(value);
      }
    } else if (typeof value === 'string') {
      // 字符串参数，解析为日期
      this.__dayjs = dayjs(value);
    } else if (value instanceof Date) {
      // 原生Date对象
      this.__dayjs = dayjs(value);
    } else if (value && typeof value === 'object' && typeof (value as any).isValid === 'function') {
      // dayjs对象（通过检查isValid方法存在性来判断）
      this.__dayjs = value as dayjs.Dayjs;
    } else if (value instanceof DateTimeCore) {
      // DateTimeCore对象
      this.__dayjs = value.dayjs();
    } else {
      throw new Error('Invalid time type');
    }
  }

  /**
   * 获取内部dayjs实例
   * @returns {dayjs.Dayjs} dayjs实例
   * @example
   * const date = new DateTimeCore();
   * const dayjsInstance = date.instance();
   */
  public dayjs(): dayjs.Dayjs {
    return this.__dayjs;
  }
}